package ppd;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.concurrent.atomic.AtomicInteger;

/**
 *
 * @author houdemer
 */
public class BuveurImpl extends UnicastRemoteObject implements Buveur, Runnable{

    private AtomicInteger niveauCourant;
    private AtomicInteger niveauMax;
    private boolean gameOver;

    
    public BuveurImpl(int capacite) throws RemoteException{
        niveauCourant = new AtomicInteger(capacite);
        niveauMax = new AtomicInteger(capacite);
        gameOver=false;
    }
    
    public void remplir() throws RemoteException{
    	System.out.println("Buveur : Chouette on a rempli mon verre!");
        niveauCourant.set(niveauMax.get());
    }

    public int getNiveauCourant() throws RemoteException{
        return niveauCourant.get();
    }

    public int getNiveauMax() throws RemoteException{
        return niveauMax.get();
    }

    public double getRapport() throws RemoteException{
	
	double numerateur=(double)niveauCourant.get();
	double denominateur=(double)niveauMax.get();
        //System.out.println("On m'a demande un rapport et voici le rapport: "+(numerateur/denominateur));
	return (double)(numerateur/denominateur);
    }

    public synchronized void boire() throws RemoteException{
	System.out.println("Buveur : Je bois!! Il ne me reste plus que "+niveauCourant.decrementAndGet()+" gorgees sur "+getNiveauMax()+".");
        if((double)( (double)niveauCourant.get() / (double)niveauMax.get()) < 0.45) System.out.println("Serveur! Je commence a etre juste niveau boisson la!");
        if(gameOver) System.out.println("De toute façon j'ai deja attendu trop longtemps tout a l'heure je ne frequenterai plus ce bar... ");
        //System.out.println("J'ai bu!! Mon niveau max est "+getNiveauMax()+" et il me reste "+getNiveauCourant()+" gorgees.");

        if(getNiveauCourant()<0){ gameOver=true; System.out.println("JAI TRES SOIIIIIIIIIIIIIFFFFFF");}
        try{
            wait(2000);
        }catch (InterruptedException e){
            System.out.println("Un client est tombe dans un comas ethylique...");
        }
    }
    
    public void run() {
        while(true) try {
            this.boire();
        } catch (RemoteException ex) {
            System.err.println("Une erreur de type RemoteException est survenue lorsqu'un client a voulu boire...");
        }
    }

}
